iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
自我挑戰組

從無到有打造驗證碼共享的 Line 機器人系列 第 18

使用 Template Message 替 Line Bot 加上同意條款的功能(1)

  • 分享至 

  • xImage
  •  

昨天我們使用了 Quick Reply 讓使用者可直接跟我們回應的訊息互動,今天要使用 Template Message 做一個在互動上也蠻常見的功能 - 同意服務條款。

新增一張 Sheet 紀錄 User 狀態

現在的驗證碼小幫手需要紀錄使用者是否 1. 已認證 2. 已同意條款,而且之後也需要取得 User Profile 等資訊,勢必要新增一張資料表紀錄 User 資訊方便更新及檢閱。

建立 sheet users

在原本的 auto-get-verification-code 試算表新增一張工作表 users,並加入標題列如下:
add user sheet

流程構思

目的是在原先的流程上加入同意條款的功能,時間點可以視情況選擇在身份認證之前或之後,這次先選擇在身份認證之後。所以流程大致如下:

  1. 使用者加入好友到身份認證前的流程皆相同
  2. 身份認證時,也會在 users sheet 寫入 user_idis_verified 欄位
  3. 使用者已認證,在接收到使用者訊息前先檢查是否已同意條款
    • 已同意:繼續執行原本的 handleMessageEvent
    • 未同意:跳出請先同意服務條款的訊息,直到收到使用者同意的 webhook postback event,同時將使用者的 agree_terms 寫入 1

身份認證時新增寫入 users sheet 功能

首先我們要新增對 users sheet 執行 query & upsert 的功能

修改 tagVerificationCode.gs

加入 upsertUserInfo & getUserRowIndex

  • getUserRowIndex 尋找 users sheet 裡面是否已經有這個 userId,有的話回傳列號,沒有的話就在最後新增一列這個 userId 的資料並回傳列號
  • upsertUserInfo 則是根據輸入的 userData object 執行對應 columnname 的資料更新
function upsertUserInfo(userId, userData) {
  Logger.log('start upsertUserInfo');
  var fillableKeys = {
    'name':1,	
    'email':2,
    'is_verifed':3,
    'agree_terms':4,
    'updated_at':6
  }
  
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('users');
  var userRowIndex = getUserRowIndex(sheet, userId);
  var userRowRange = sheet.getRange(userRowIndex, 1, 1, 7);
  var userRowData = userRowRange.getValues()[0];
  Object.entries(userData).forEach(([key, value]) => {
    if (fillableKeys[key] !== undefined) {
      userRowData[fillableKeys[key]] = value;
    }
  });
  userRowData[6] = new Date();
  userRowRange.setValues([userRowData]);
}

function getUserRowIndex(userSheet, userId) {
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(userSheet, 'user_id', userId);
  if (searchResult !== -1) {
    return searchResult+2;
  } 

  // create new user row  
  var lastRow = userSheet.getLastRow();
  var range = userSheet.getRange(++lastRow, 1, 1, 6);
  range.setValues([[userId,,,,, new Date()]]);
  return lastRow;
}

接著在 tagVerificationCode 裡新增紀錄 user 已經認證的功能

function tagVerificationCode(target, userId) {
  var sheet = ReadMailAndInsertToGoogleSheet.connectToSheet('verification_code');
  var searchResult = ReadMailAndInsertToGoogleSheet.searchColumnValue(sheet, 'code', target);
  if (searchResult !== -1) {
    var targetRowIndex = searchResult+2;
    var userIdValue = sheet.getRange(targetRowIndex, 2, 1, 1).getValue();
    if (userIdValue.length === 0) {
      var targetRange =  sheet.getRange((searchResult+2), 2, 1, 2);
      targetRange.setValues([[userId, new Date()]]);
      // 加入下面這行
      upsertUserInfo(userId, {'is_verifed': true});
      return true;
    }
  }
  return false;
}

這樣一來我們就可以在使用者認證時紀錄資訊在 users sheet,並且可以用同樣的方式紀錄接下來的同意條款結果,明天繼續完成用 Template Message 發送同意條款資訊,以及寫入 users sheet!


上一篇
使用 Quick Reply 改善 Line Bot 互動
下一篇
使用 Template Message 替 Line Bot 加上同意條款的功能(2)
系列文
從無到有打造驗證碼共享的 Line 機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言